package common

import (
	"fmt"
	"io/fs"
	"os"
	"path/filepath"
)

func FindOneFile(parentMenu, target string) (string, error) {
	// 获取上级目录路径
	parentDir, err := filepath.Abs(parentMenu)
	if err != nil {
		return "", fmt.Errorf("get parent dir error: %w", err)
	}

	var foundPath string

	// 遍历上级目录及所有子目录，找到第一个匹配即返回
	err = filepath.WalkDir(parentDir, func(path string, d fs.DirEntry, err error) error {
		if err != nil {
			return nil // 忽略访问错误的目录，继续搜索
		}

		// 如果已经找到文件，直接跳过后续处理
		if foundPath != "" {
			return nil
		}

		// 匹配目标文件名
		if !d.IsDir() && filepath.Base(path) == target {
			absPath, _ := filepath.Abs(path) // 获取绝对路径
			foundPath = absPath
			return fs.SkipAll // 找到文件后立即停止搜索
		}

		return nil
	})

	if foundPath != "" {
		return foundPath, nil
	}

	if err != nil {
		return "", fmt.Errorf("search error: %w", err)
	}

	return "", fmt.Errorf("file '%s' not found in %s or its subdirectories", target, parentDir)
}

// 检查文件是否正在被使用
func IsFileInUse(filePath string) bool {
	file, err := os.OpenFile(filePath, os.O_RDWR|os.O_EXCL, 0666)
	if err != nil {
		// 如果出现"文件正在使用"的错误，返回true
		if os.IsPermission(err) || os.IsExist(err) {
			return true
		}
		return false
	}
	file.Close()
	return false
}
